package com.app.internationaltravel.service.impl;

import com.app.internationaltravel.dao.SmsDao;
import com.app.internationaltravel.dao.UserDao;
import com.app.internationaltravel.dto.PhoneCodeDto;
import com.app.internationaltravel.entity.Sms;
import com.app.internationaltravel.entity.User;
import com.app.internationaltravel.service.intf.SmsService;
import com.app.internationaltravel.util.AliSmsUtil;
import com.app.internationaltravel.util.JedisUtil;
import com.app.internationaltravel.vo.R;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.Date;

/**
 * @author 刘豆豆
 * @date 2022/12/12
 */
@Service
public class SmsServiceImpl implements SmsService {

  @Resource
  private SmsDao dao;
  @Resource
  private UserDao userDao;

  /**
   * 1.发送注册的验证码*/
  @Override
  public R sendRegisterCode(String phone) {
    return sendCode(phone,"register","注册");
  }

  /**
   * 封装 验证码发送
   * @param phone 手机号
   * @param key  Redis的key
   * @param name 功能名*/
  private R sendCode(String phone,String key,String name){
    //1.参数校验
    if(StringUtils.hasLength(phone)) {
      //2.手机号 正则校验 符合手机号格式
      if (phone.matches("^1[3456789]\\d{9}$")) {

        //3.发送短信验证码  验证码 6位 有效期10分钟

        //生成随机6位的验证码
        int code= AliSmsUtil.createCode(6);
        //第三方发送短息
//        boolean b = AliSmsUtil.sendSms(phone, code);
        System.err.println("验证码："+code);
        //发送并验证发送结果
        if(true){//为了Money 假的发送
//                if(AliSmsUtil.sendSms(phone,code)){

          //4.发送成功 记录验证码
          //考虑使用Redis 有效期10分钟  String类型，有效期 存储：key 手机号 值 验证码
          JedisUtil.addStr("auth:"+key+":"+phone,code+"",600);

          //5.记录 发送 到数据库
          dao.insert(new Sms(1,phone,"发送"+name+"验证码成功",new Date()));

          //6.返回
          return R.ok("验证码："+code);
        }
      }
    }
    return R.fail("亲，验证码发送失败！");
  }
  @Override
  public R sendLoginCode(String phone) {
    return sendCode(phone,"login","登录");
  }

  @Override
  public R checkRegiterCode(PhoneCodeDto dto) {
    //1.参数校验
    if(dto!=null){
      if(StringUtils.hasLength(dto.getPhone())){
        //2.校验 是否存在验证码
        if(JedisUtil.existsKey("auth:register:"+dto.getPhone())){

          //3.存在  验证 验证码是否正确
          if(JedisUtil.getStr("auth:register:"+dto.getPhone()).equals(dto.getCode())){
            // 验证码正确
            //4.删除验证码
            JedisUtil.delKeys("auth:register:"+dto.getPhone());
            //5.记录一下，校验过的手机号 存储Redis Set类型：唯一
            JedisUtil.addSet("auth:checkphones",dto.getPhone());

            return R.ok();
          }
        }else {
          return R.fail("亲，验证码已失效！");
        }
      }
    }
    return R.fail("亲，验证码不正确！");
  }

  @Override
  public R sendFindCode(String phone) {
    //1.查询 是否存在对应的手机号
    if(userDao.selectOne(new QueryWrapper<User>().eq("phone",phone))!=null) {
      return sendCode(phone, "find", "密码找回");
    }
    return R.fail("亲，您还没注册呢！");
  }

  @Override
  public R all() {
    return R.ok(dao.selectList(null));
  }

}
